//============================================================================
// Name        : FANN.cpp
// Author      : Italo Alfaro
// Version     :
// Copyright   :
// Description : Entrenamiento de la red
//============================================================================
#include "fann.h"
#include <stdio.h>
#include "floatfann.h"
#include <iostream>

using namespace std;


int main(int argc, char *argv[])
{

		//datos de la red
	    const unsigned int num_entradas = 18;
	    const unsigned int num_salidas = 18;
	    const unsigned int num_capas = 3;
	    const unsigned int num_neurons_hidden = 18;
	    //error deseado
	    const float error_deseado = (const float) 0.0000;
	    //iteracones para reducir el error al deseado
	    const unsigned int max_iteraciones = 50;
	    //cada cuntasiteraciones reportar el error actual
	    const unsigned int reportes_iteraciones = 10;

	    //fann_type input[2];
	    //fann_type output[1];
	    //crea la red a partir de los datos
	    struct fann *ann = fann_create_standard(num_capas, num_entradas, num_neurons_hidden, num_salidas);

	    //seteo de la función de activación para las capas de salida y hidden
	    fann_set_activation_function_hidden(ann, FANN_SIGMOID_SYMMETRIC);
	    fann_set_activation_function_output(ann, FANN_SIGMOID_SYMMETRIC);
	    //seteo del steepness, es el valor para que aproxime más rapidamente a valores extremos(mientras más alto aproxima más rapido, valor maximo 1)
	    fann_set_activation_steepness_hidden(ann,1);
	    fann_set_activation_steepness_output(ann,1);

	    //entrena la red desde el archivo entradas.data que esta en la carpeta del proyecto)
	    //fann_train_on_file(ann, "train_resultado.data", max_iteraciones, reportes_iteraciones, error_deseado);
	    fann_train_on_file(ann, argv[1], max_iteraciones, reportes_iteraciones, error_deseado);

	    //crea e archivo red.net con los datos de la red ya entrenada
	    //fann_save(ann, "red_prueba.net");
	    fann_save(ann, argv[2]);

	    fann_destroy(ann);
	cout<<"ready"<< endl;

    return 0;
}


